package cn.tx.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @author: 可乐加糖
 * @create: 2023-02-28 15:14
 * @Description: Redis 命令测试
 */
public class RedisController {
    private static final Logger logger = LoggerFactory.getLogger(RedisController.class);

    private final static String SUO_KEY = "cs:suo:";

    @Autowired
    private StringRedisTemplate stringRedisTemplate;


    @Autowired
    private RedisTemplate redisTemplate;

    // 发布订阅 http://localhost:8083/getByUserIdId?userId=1
    @GetMapping("/getUserById")
    public String getUserById(String userId){
        //TODO 执行主业务
        redisTemplate.convertAndSend("redis.user", userId);
        return "hello:" + userId;
    }

    /**
     * 获取锁
     * je: 订单唯一ID
     * @return
     */
    public boolean huoqu(Long je) {
        // 生成uuid 做锁的value
        String uuid = UUID.randomUUID().toString();
        // stringRedisTemplate.opsForValue().setIfAbsent(SUO_KEY + je, uuid,60,TimeUnit.SECONDS)
        // setIfAbsent() :在java中使用setnx就需要调用setIfAbsent（）他会返回一个状态值
        // 根据你当前传送的key 判断是否存在。如果存在返回false。表示锁已被其他线程创建
        // 根据你当前传送的key 判断是否存在。如果存在返回true。表示锁已被当前创建成功
        // SUO_KEY + je ：锁的唯一key
        // uuid：value值
        // 60,TimeUnit.SECONDS ：失效时间 一定要设置失效时间。防止业务代码异常无法释放锁。可以靠失效时间自动释放
        return Boolean.TRUE.equals(stringRedisTemplate.opsForValue().setIfAbsent(SUO_KEY + je, uuid,60, TimeUnit.SECONDS));
    }

    /**
     * 释放锁
     * 释放锁就等于将对应的锁key 在缓存中删除即可
     * @return
     */
    public void shanc(Long je) {
        stringRedisTemplate.delete(SUO_KEY + je);
    }

}
